再來我們要進入重點了,開始寫測試
因為整個專案要測的地方應該蠻多的
今天應該就是介紹單元測試及整合測試的例子
但在這之前,還是要先介紹一個工具給大家 - Capybara
水獺是我們的測試好朋友,在寫好測試的時候,我們會用它來跑使用者的流程
看看流程哪邊不順,或者有沒有出現預期的效果或畫面等等
為了讓我們在測試的時候更方便,我們需要做以下設定
讓我們在使用 FactoryBot 的方法時,不需要加上 FactoryBot. 前綴
# spec/support/factory.rb
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end
接著要到 rails_helper
裡面設定 factory 的檔案放在哪裡
# spec/rails_helper.rb
Dir[Rails.root.join('./spec/support/**/*.rb')].each { |f| require f }
在 spec_helper
(放置 Rspec 測試的相關設定) 載入 rails_helper
# spec/spec_helper.rb
require 'rails_helper'
如果要看畫面的話,要把 _headless 拿掉
以下是比較陽春的設定,詳細的設定可參閱官網或尋找相關資源
# spec/support/capybara.rb
Capybara.current_driver = :selenium_chrome_headless
Capybara.enable_aria_label = true
我們會使用 rspec 來進行測試
安裝方式可看官方文件
如之前提到的,單元測試是把功能切分成更細小的區塊來做,以我們的例子來說,可以測試購物車中的消費金額有多少
RSpec.describe '購物車', type: :model do
let(:cart) { create(:cart, :has_two_drinks) }
describe '加入購物車' do
context "當購物車裡面有 2 個 100 元商品" do
it '計算購物車總金額' do
expect(cart.total_price).to eq 200
end
end
end
end
CRUD 這種基本的功能都歸類在整合測試中,其他附加的功能也算是整合測試的一種
我們就直接拿 新增飲品 來測試吧
RSpec.describe '飲品流程', type: :feature do
let!(:user) { create(:user, :owner)}
before do
visit new_user_session_path
page.find("#user_email").fill_in with: user.email
page.find("#user_password").fill_in with: 'password'
click_button '登入'
expect(page).to have_content("登入成功")
end
describe '建立飲品' do
context "當該填的欄位都填好" do
it '應該要建立成功' do
visit new_admin_drink_path
fill_in :drink_name, with: '好喝的'
fill_in :drink_price, with: Faker::Number.between(from: 150, to: 200)
click_button '送出'
expect(page).to have_content('飲品建立成功')
end
end
end
end
分別為 Arrange / Act / Assert,我們拿剛剛的買牛奶例子來解釋
Spec.describe '飲品流程', type: :feature do
# Arrange 安排,將要測試的資料都備齊
let!(:user) { create(:user, :owner)}
before do
visit new_user_session_path
page.find("#user_email").fill_in with: user.email
page.find("#user_password").fill_in with: 'password'
click_button '登入'
expect(page).to have_content("登入成功")
end
describe '建立飲品' do
context "當該填的欄位都填好" do
it '應該要建立成功' do
visit new_admin_drink_path
# Act 執行,撰寫方法並測試
fill_in :drink_name, with: '好喝的'
fill_in :drink_price, with: Faker::Number.between(from: 150, to: 200)
click_button '送出'
# Assert 驗收,執行結果是否符合預期規格
expect(page).to have_content('飲品建立成功')
end
end
end
end